// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

// go:构建计划9 
// /+构建计划9 

package runtime

import "runtime/internal/atomic"

var netpollInited uint32
var netpollWaiters uint32

var netpollStubLock mutex
var netpollNote note

// /NetPollBreaked受netpollBrokenLock保护，可避免双重记事本唤醒。
var netpollBrokenLock mutex
var netpollBroken bool

func netpollGenericInit() {
	atomic.Store(&netpollInited, 1)
}

func netpollBreak() {
	lock(&netpollBrokenLock)
	broken := netpollBroken
	netpollBroken = true
	if !broken {
		notewakeup(&netpollNote)
	}
	unlock(&netpollBrokenLock)
}

// 轮询准备就绪的网络连接。
// 返回可运行的goroutine列表。
func netpoll(delay int64) gList {
	// 针对不支持
	// 集成网络轮询器的平台实施。
	if delay != 0 {
		// 此锁确保只有一个goroutine尝试使用
		// 注释。它通常应该是完全没有争议的。
		lock(&netpollStubLock)

		lock(&netpollBrokenLock)
		noteclear(&netpollNote)
		netpollBroken = false
		unlock(&netpollBrokenLock)

		notetsleep(&netpollNote, delay)
		unlock(&netpollStubLock)
		// 在锁被争用时防止饥饿
		// （如运行TestNetpollBreak时）。
		osyield()
	}
	return gList{}
}

func netpollinited() bool {
	return atomic.Load(&netpollInited) != 0
}
